package com.portal.framework.dao;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.hibernate.LockMode;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.portal.framework.exception.AppException;
import com.portal.framework.page.PagerResult;
import com.portal.framework.util.DBUtil;

public abstract class JDBCDAOSupport<C, PK extends Serializable> extends
		JdbcDaoSupport 
		//implements BaseIDAO<C, PK> 
	{
	/**
	 * 得到DAO要实现的哪个类的Class.
	 */
	public abstract Class<C> getPersistentClass();

	public boolean isExistByPropForCreate(String propName, Object propValue) {
		return false;
	}

	public boolean isExistByPropForUpdate(String propName, Object propValue,
			PK id) {
		return false;
	}

	public List<C> findByPropExceptPK(String propName, Object propValue, PK id) {
		return null;
	}

	/**
	 * 传入一个对象,保存或更新该对象
	 * 
	 * @param obj
	 * @return
	 */
	public C saveOrUpdate(C obj) {
		return null;
	}

	/**
	 * 保存对象
	 * 
	 * @param obj
	 * @return
	 */
	public C create(C obj) {
		return null;
	}

	/**
	 * 更新对象
	 * 
	 * @param obj
	 * @return
	 */
	public C update(C obj) {
		return null;
	}

	/**
	 * 批量保存
	 * 
	 * @param objs
	 * @return
	 */
	public List<C> createBatch(List<C> objs) {
		return null;
	}

	/**
	 * 批量更新
	 * 
	 * @param objs
	 * @return
	 */
	public List<C> updateBatch(List<C> objs) {
		return null;
	}

	/**
	 * 删除传入的对象
	 * 
	 * @param obj
	 */
	public void delete(C obj) {
	}

	/**
	 * 批量删除一个List里的全部对象
	 * 
	 * @param objs
	 */
	public void deleteBatch(List<C> objs) {
	}

	/**
	 * 删除ID在列表中的所有记录,返回已删除的记录数.
	 * 
	 * @param ids ID的数组
	 * @return 已删除的记录数.
	 */
	public int deleteBatch(PK[] ids) {
		return 0;
	}

	/**
	 * 删除ID在列表中加上where判断语句的所有记录
	 * 
	 * @param ids 要删除的ID数组
	 * @param whereQuery where判断语句
	 * @return 已删除的记录数
	 */
	public int deleteBatch(PK[] ids, String whereQuery) {
		return 0;
	}

	/**
	 * 根据ID删除一个对象,返回影响的记录数.
	 * 
	 * @param id
	 * @return
	 */
	public int delete(PK id) {
		return 0;
	}

	/**
	 * 列表所有的对象
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<C> findAll() {
		return null;
	}

	/**
	 * 根据querySQL和参数查找 <code>
	 * 	find("FROM ClassName o WHERE o.name = ? AND o.age = ?","chenxingji" , "11");
	 * </code>
	 * 
	 * @param query
	 * @param os SQL中的参数,对应SQL中的问号
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<C> find(String query, Object... os) {
		return null;
	}

	/**
	 * 根据querySQL和参数查找 <br>
	 * <code>
	 * 	find(100,"FROM ClassName o WHERE o.name = ? AND o.age = ?","chenxingji" , 11);
	 * </code>
	 * 
	 * @param query
	 * @param maxResult 搜索的最大记录
	 * @param os SQL中的参数,对应SQL中的问号
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<C> find(int maxResult, String query, Object... os) {
		return null;
	}

	/**
	 * 根据querySQL查找 <code>
	 */
	@SuppressWarnings("unchecked")
	public List<C> find(String query) {
		return null;
	}

	/**
	 * 根据querySQL唯一查找,查找到多个对象只返回第一个,如果查找不到返回null
	 * 
	 * @param query
	 * @param os SQL语句中的参数
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public C uniqueFind(String query, Object... os) {
		return null;
	}

	/**
	 * 根据querySQL唯一查找,查找到多个对象只返回第一个,如果查找不到返回null
	 * 
	 * @param query
	 * @return 查找到多个对象只返回第一个,如果查找不到返回null
	 */
	@SuppressWarnings("unchecked")
	public C uniqueFind(String query) {
		return null;
	}

	/**
	 * 执行一条HQL语句(DELETE,UPDATE...)
	 * 
	 * @param query
	 * @param os 参数
	 * @return 返回影响记录数
	 */
	public int executeQuery(String query, Object... os) {
		return 0;
	}

	/**
	 * 执行一条HQL语句(DELETE,UPDATE...)
	 * 
	 * @param query HQL 语句
	 * @param os
	 * @return 返回影响记录数
	 */
	public int executeQuery(String query) {
		return 0;
	}

	/**
	 * 根据对象的属性和值查找
	 * 
	 * @param propName 属性名
	 * @param value 属性值
	 * @return
	 */
	public List<C> findByProp(String propName, Object value) {
		return null;
	}

	/**
	 * 根据ID查找
	 * 
	 * @param pk
	 * @return
	 */
	public C findById(PK pk) {
		return null;
	}

	/**
	 * 传入一条select count(*)的SQL语句,返回记录数
	 * 
	 * @param query
	 * @param os SQL语句的参数
	 * @return
	 */
	public int countQuery(String query, Object... os) {
		return 0;
	}

	/**
	 * 传入一条select count(*)的SQL语句,返回记录数
	 * 
	 * @param query
	 * @return
	 */
	public int countQuery(String query) {
		return 0;
	}

	/**
	 * 根据querySQL和参数查找,参数可以是Collection或数组
	 * 
	 * @param query HQL语句
	 * @param paramNames 参数的名字
	 * @param values 值
	 * @return 结果列表
	 */
	public List<C> findByNamedParam(String query, String paramName, Object value) {
		return null;
	}

	/**
	 * 根据querySQL和参数查找,参数可以是Collection或数组<BR>
	 * 参数个数要与值的个数相等
	 * 
	 * @param query HQL语句
	 * @param paramNames 参数的名字(数组)
	 * @param values 值(数组)
	 * @return 结果列表
	 */
	public List<C> findByNamedParam(String query, String[] paramNames,
			Object[] values) {
		return null;
	}

	/**
	 * 根据字段名,字段值查找不等于传入ID的数据<br>
	 * 一般在更新的时候使用该方法,某一个字段不能重复但不等要更新的ID
	 * 
	 * @param propName 字段名
	 * @param propValue 字段值
	 * @param id 不等于的ID
	 * @return 对象列表
	 */
	public List<C> findByPropAndPKNotIn(String propName, Object propValue, PK id) {
		return null;
	}

	/**
	 * 传入搜索的SearchForm,返回PagerResult(包括对象列表和分页器)
	 * 
	 * @param form
	 * @return
	 */
	public PagerResult<C> findByCondision(ISearchForm form) {
		return null;
	}

	/**
	 * 批量删除
	 * 
	 * @param delSql 删除语句
	 * @return
	 */
	public int deleteBatch(final String delSql) {
		return 0;
	}

	/**
	 * 执行DELETE 和 UDPATE 的SQL语句
	 * 
	 * @param queryString HQL 语句 ,paramNames和values记录数要一样
	 * @param paramNames 传入的参数
	 * @param values 传入的值
	 * @return 影响的记录数
	 */
	public int bulkUpdateByNamedParam(final String queryString,
			final String[] paramNames, final Object[] values) {
		return 0;
	}

	/**
	 * 执行DELETE 和 UDPATE 的SQL语句
	 * 
	 * @param queryString HQL 语句
	 * @param paramNames 传入的参数
	 * @param values 传入的值
	 * @return 影响的记录数
	 */
	public int bulkUpdateByNamedParam(final String queryString,
			final String paramNames, final Object values) {
		return 0;
	}

	/**
	 * 根据SQL语句进行查找
	 * 
	 * @param sql SQL语句
	 * @return 数据的列表
	 */
	public List<Object[]> findBySQL(final String sql) {
		return null;
	}

	/**
	 * 根据一条HQL语句进行查询,查询出来的结果一般不是一个DTO对象.
	 * 
	 * @param hql HQL语句
	 * @return 对象数组
	 */
	public List<Object[]> findByHQL(String hql) {
		return null;
	}

	/**
	 * 根据一条HQL语句进行查询,查询出来的结果一般不是一个DTO对象.
	 * 
	 * @param hql HQL语句
	 * @param values 参数,对应HQL语句中的?
	 * @return 对象数组
	 */
	public List<Object[]> findByHQL(String hql, Object... values) {
		return null;
	}

	/**
	 * @param rs
	 * @return ������
	 * @throws AppException
	 * @throws SQLException
	 */
	@SuppressWarnings("unchecked")
	protected Map getHashMapByRS(ResultSet rs) throws AppException,
			SQLException {

		ResultSetMetaData rsMeta = rs.getMetaData();
		int i = rsMeta.getColumnCount();
		Map hm = new HashMap();
		String sColumName = null;
		String value = null;
		for (; i > 0; i--) {
			sColumName = rsMeta.getColumnName(i).toLowerCase();
			value = rs.getString(sColumName);
			hm.put(sColumName, value);
		}
		return hm;

	}

	/**
	 * @param oBean
	 * @param rs
	 * @throws AppException
	 */
	@SuppressWarnings("unchecked")
	public Object getObjByRS(ResultSet rs, Object oBean) throws AppException {
		try {
			Map hm = getHashMapByRS(rs);
			BeanUtils.populate(oBean, hm);
			return oBean;
		} catch (IllegalAccessException e) {
			throw new AppException(e.getMessage());
		} catch (InvocationTargetException e) {
			throw new AppException(e.getMessage());
		} catch (SQLException ex) {
			throw DBUtil.convertException(ex);
		}
	}

	public <T> List<T> findBySQL(Class<T> cls, String sql) {
		return null;
	}

	public int executeBySQL(final String sql, final Object... args) {
		return 0;
	}

	public <T> List<T> findByNamedParam(Class<T> cls, String query,
			String[] paramNames, Object[] values) {
		return null;
	}

	public <T> List<T> findByNamedParam(Class<T> cls, String query,
			String paramName, Object value) {
		return null;
	}

	public C findById(PK pk, LockMode lockMode) {
		return null;
	}

	public <T> List<T> findBySQL(Class<T> cls, String sql, Object... args) {
		return null;
	}

	public List<Object[]> findBySQL(final String sql, final Object... args) {
		return null;
	}

	public <T>PagerResult<T> findByCondisionAndCast(Class<?> searchClazz, ISearchForm searchForm, Class<T> retClazz) {
		return null;
	}


	// public List<T> find(final LockMode lockMode, final String lockAlias,
	// final String query) {
	// return null;
	// }
	//
	// public List<T> find(final LockMode lockMode, final String lockAlias,
	// final String query, final Object... os) {
	// return null;
	// }
}
